簡單工廠
簡單工廠也叫靜態(tài)工廠
- 簡單工廠是屬于創(chuàng)建型模式。簡單工廠是由一個工廠對象決定創(chuàng)建出哪一種產品類的實例。簡單工廠是工廠模式家族中最簡單的實用模式
- 簡單工廠:定義了一個創(chuàng)建對象的類蹋岩,由這個類來封裝實例化對象的行為
在開發(fā)中惰匙,當我們會用到大量的創(chuàng)建某種豺总、某類羡榴、或者某批對象時,就會使用到工廠模式箕速。
簡單的例子
生鮮
public abstract class Fresh {
protected String name;
public abstract void prepare();
public void washing() {
System.out.println(name + "正在清洗");
}
public void cut() {
System.out.println(name + "正在分切");
}
public void box() {
System.out.println(name + "正在打包");
}
}
黃瓜
public class Cucumber extends Fresh {
public Cucumber() {
super.name = "黃瓜";
}
@Override
public void prepare() {
System.out.println(super.name + "正在準備");
}
}
西藍花
public class Broccoli extends Fresh {
public Broccoli() {
super.name = "西藍花";
}
@Override
public void prepare() {
System.out.println(super.name + "正在準備");
}
}
生鮮廠
public class Factory {
public static Fresh create(String type) {
if (type.equals("broccoli")) {
return new Broccoli();
} else if (type.equals("cucumber")) {
return new Cucumber();
} else {
return null;
}
}
}
河馬生鮮
public class Boxhorse {
public Boxhorse() {
Fresh fresh = null;
String orderType; // 訂購生鮮產品
do {
fresh = Factory.create(getType());
if (null != fresh) {
fresh.prepare();
fresh.washing();
fresh.cut();
fresh.box();
} else {
System.out.println("不賣了");
break;
}
} while (true);
}
private String getType() {
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
System.out.println("input type: ");
try {
return bufferedReader.readLine();
} catch (IOException e) {
e.printStackTrace();
}
return "";
}
}
Main
public class Main {
public static void main(String[] args) {
new Boxhorse();
}
}
在這里解釋一下每個類的作用
Fresh.java酪碘,生鮮食品
Cucumber.java, 黃瓜
Broccoli.java 西藍花
Factory.java 生鮮加工廠。 這個類就是我們這個簡單工廠的核心代碼了盐茎,它存在的意義是統(tǒng)一加工生產生鮮產品兴垦。你只需要告訴他一個種類,便可以得到一個你想要的食品。當后面需要新增產品時探越,無需修改其他地方狡赐,只需要在工廠里新增幾行代碼即可。改動代價小
Boxhorse.java 河馬生鮮钦幔。 或許你可能會認為這個有點多余枕屉,但是實際開發(fā)過程中,生鮮商店會有很多鲤氢。就好比同城的盒馬有很多搀擂。如果不統(tǒng)一加工,那每次加工都得新開一個工廠卷玉。無法集中管理
Main.java 入口
工廠方法模式
同城的生鮮可以在一個工廠加工哨颂,但是跨省市,就無法保證新鮮了相种。但是為了讓工序變得固定威恼,食品安全可靠。我們需要擴大規(guī)模
public abstract class Fresh {
protected String name;
public abstract void prepare();
public void washing() {
System.out.println(name + "正在清洗");
}
public void cut() {
System.out.println(name + "正在分切");
}
public void box() {
System.out.println(name + "正在打包");
}
}
public class Panda extends Fresh {
public Panda() {
super.name = "鮮活大熊貓";
}
@Override
public void prepare() {
System.out.println(super.name + "正在清洗");
}
}
public class Octopus extends Fresh {
public Octopus() {
super.name = "鮮活八爪魚";
}
@Override
public void prepare() {
System.out.println(super.name + "正在清洗");
}
}
public class Fungi extends Fresh {
public Fungi() {
super.name = "新鮮菌類";
}
@Override
public void prepare() {
System.out.println(super.name + "正在清洗");
}
}
public class Crab extends Fresh {
public Crab() {
super.name = "鮮活梭子蟹";
}
@Override
public void prepare() {
System.out.println(super.name + "正在清洗");
}
}
主要的四個類
public abstract class BaseFactory {
public BaseFactory(String factoryName) {
System.out.println(factoryName);
}
/**
* 訂購
*/
public void shopping() {
do {
Fresh fresh = createFresh(getType());
if (null != fresh) {
fresh.prepare();
fresh.cut();
fresh.box();
} else {
System.out.println("沒有寝并,不賣了");
break;
}
} while (true);
}
/**
* 子類實現(xiàn)生鮮的制作箫措,總部只負責調度,派發(fā)
*
* @param type 產品
* @return 生鮮類
*/
abstract Fresh createFresh(String type);
private String getType() {
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
System.out.println("input fresh type: ");
try {
return bufferedReader.readLine();
} catch (IOException e) {
e.printStackTrace();
}
return "";
}
}
public class CDFactory extends BaseFactory {
public CDFactory() {
super("成都工廠");
}
@Override
Fresh createFresh(String type) {
if ("fungi".equals(type)) {
return new Fungi();
} else if ("panda".equals(type)) {
return new Panda();
}
return null;
}
}
public class GZFactory extends BaseFactory {
public GZFactory() {
super("廣州工廠");
}
@Override
Fresh createFresh(String type) {
if ("octopus".equals(type)) {
return new Octopus();
} else if ("crab".equals(type)) {
return new Crab();
}
return null;
}
}
public class Boxhorse {
private BaseFactory factory;
public Boxhorse() {
// 需要初始化一個工廠
this.factory = new CDFactory();
}
public void shopping() {
if (null != this.factory) {
this.factory.shopping();
} else {
System.out.println("沒有選擇工廠");
}
}
}
生鮮類就不解釋了衬潦,這里主要變化的有四個類
BaseFactory.java 工廠總部斤蔓。用戶下單到總部,由總部下單到子工廠镀岛。
CDFactory.java 成都工廠附迷。成都工廠負責成都市的生鮮制作與派發(fā),主要產品有大熊貓哎媚、菌子
GZFactory.java 廣州工廠。廣州工廠負責廣州市的生鮮制作與派發(fā)喊儡,主要產品有梭子蟹拨与、八爪魚
Boxhorse.java 生鮮超市。一個生鮮超市配有一個工廠
public class Main {
public static void main(String[] args) {
new Boxhorse().shopping();
new Boxhorse2().shopping();
}
}
console
成都工廠
input fresh type:
panda
鮮活大熊貓正在清洗
鮮活大熊貓正在分切
鮮活大熊貓正在打包
input fresh type:
crab
沒有艾猜,不賣了
廣州工廠
input fresh type:
crab
鮮活梭子蟹正在清洗
鮮活梭子蟹正在分切
鮮活梭子蟹正在打包
input fresh type:
exit
沒有买喧,不賣了Process finished with exit code 0
下面是拓展,加入了單例模式
所有工廠必須取得證書才可以生產出產品匆赃,證書有限淤毛,只有兩個。但是卻有三個廠
由基類(工廠總部)進行證書的派發(fā)與校驗算柳。實際上這里才能感受到工廠方法模式最大的省事之處低淡。
enum Authorization {
INSTANCE;
List<String> authorized = new ArrayList<>();
List<String> certificate = new ArrayList<>(Arrays.asList("A1", "A2"));
/**
* 取得證書
* @return 證書
*/
String getAuth() {
String auth = null;
if (certificate.size() > 0) {
auth = certificate.get(0);
authorized.add(auth);
certificate.remove(0);
}
return auth;
}
/**
* 檢查證書
* @param auth 證書
* @return 是否存在
*/
boolean check(String auth) {
return authorized.contains(auth);
}
}
public abstract class BaseFactory{
private boolean admit = false;
private String factoryName;
public BaseFactory(String auth, String factoryName) {
this.factoryName = factoryName;
this.admit = Authorization.INSTANCE.check(auth);
}
public void shopping() {
if (admit) {
System.out.println(factoryName + "取得認證");
do {
Fresh fresh = createFresh(getType());
if (null != fresh) {
fresh.prepare();
fresh.cut();
fresh.box();
} else {
System.out.println("沒有,不賣了");
break;
}
} while (true);
} else {
System.out.println(factoryName + "沒有取得認證,結束");
}
}
/**
* 子類實現(xiàn)生鮮
* @param type 產品
* @return 生鮮類
*/
abstract Fresh createFresh(String type);
/**
* 各個工廠都需要獲得證書才可以生產生鮮
* @return String
*/
protected static String authorization() {
return Authorization.INSTANCE.getAuth();
}
private String getType() {
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
System.out.println("input fresh type: ");
try {
return bufferedReader.readLine();
} catch (IOException e) {
e.printStackTrace();
}
return "";
}
}
public class CDFactory extends BaseFactory {
public CDFactory() {
// 調用父類的構造器蔗蹋,并從父類取得證書何荚。傳遞給父類
super(authorization(), "成都工廠");
}
@Override
Fresh createFresh(String type) {
if ("fungi".equals(type)) {
return new Fungi();
} else if ("panda".equals(type)) {
return new Panda();
}
return null;
}
}
public class GZFactory extends BaseFactory {
public GZFactory() {
// 調用父類的構造器,并從父類取得證書猪杭。傳遞給父類
super(authorization(), "廣州工廠");
}
@Override
Fresh createFresh(String type) {
if ("octopus".equals(type)) {
return new Octopus();
} else if ("crab".equals(type)) {
return new Crab();
}
return null;
}
}
public class ZLFactory extends BaseFactory {
public ZLFactory() {
super(authorization(), "臟亂工廠");
}
@Override
Fresh createFresh(String type) {
if ("octopus".equals(type)) {
return new Octopus();
} else if ("crab".equals(type)) {
return new Crab();
}
return null;
}
}
public class Main {
public static void main(String[] args) {
new Boxhorse().shopping();
new Boxhorse2().shopping();
new Boxhorse3().shopping();
}
}
console
成都工廠取得認證
input fresh type:
crab
沒有餐塘,不賣了
廣州工廠取得認證
input fresh type:
crab
鮮活梭子蟹正在清洗
鮮活梭子蟹正在分切
鮮活梭子蟹正在打包
input fresh type:
ex
沒有,不賣了
臟亂工廠沒有取得認證皂吮,結束Process finished with exit code 0