模式引入:
工厂:任何可以产生对象的方法或者类。
简单工厂
注:这不属于23中设计模式之一
场景引入
首先,我们想象这样一个场景:创业初期,一个人开了一个工厂生产手机和智能手表。(现实生活中,当然是先生产一个,但是为了好写一些,就假装有两种产品,其实一种产品的也算)
代码实现
device interface
/*
接口,用来说明设备的生产过程
*/
public interface device {
void process();
}
phone.class
// 手机类,用来说明手机是怎么生产的
public class phone implements device{
public void process() {
System.out.println("手机的生产过程就是先这样这样,再那样那样,就生产出来了");
}
}
Watch.class
// 智能手环,用来说明智能手环是怎么生产的
public class Watch implements device {
public void process() {
System.out.println("智能手环的生产方式就是先那样那样,再这样这样,就生产出来了");
}
}
SimpleFactory.class
//这就是开的那个工厂,可以生产手机和智能手环
public class SimpleFactory {
public device create(String s){
if(s.equals("phone")){
return new phone();
}else if(s.equals("watch")){
return new Watch();
} else { **//注意这里**
throw new RuntimeException("你说的产品我们还没有,如果你们需要,我们今后会生产的");
}
}
}
test.class
public class Test {
public static void main(String[] args) {
SimpleFactory factory = new SimpleFactory();
device phone = factory.create("phone");
phone.process();
device watch = factory.create("watch");
watch.process();
/*
**注意这里**
device ipad = factory.create("ipad");
ipad.process();
*/
}
}
代码简要说明
在简单工厂中,我们只需要说明,我们需要的是什么,工厂就能调用相应的方法给我们生产出我们需要的设备。
拓展
注意在SimpleFactory
类中的最后一个else
语句,以及test
类中最后一个注释掉的语句。如下:
SimpleFactory:
Test:
想象一个具体的情况:创业者觉得自己现在生产的东西不够多,想要更多的产品。(当然,一般情况下是:人们觉得这个工厂生产的东西好,想要看看这个工产是都生产其他产品。比如这里代码中的ipad)。这种情况下,我们就需要在原来的代码中增加一个
Ipad类
:
public class Ipad implements device{
public void process() {
System.out.println("Ipad就是这样弄一下,那样弄一下,就生产出来了");
}
}
然后为了这个工产能够生产Ipad,SimpleFactory类
就需要改成下面这样:
public class SimpleFactory {
public device create(String s){
if(s.equals("phone")){
return new phone();
}else if(s.equals("watch")){
return new Watch();
}else if(s.equals("ipad")){
return new Ipad();
} else {
throw new RuntimeException("你说的产品我们还没有,如果你们需要,我们今后会生产的");
}
}
}
增加一个ipad类
其实并不影响,主要问题出现在修改了SimpleFactory类
中的代码。这就好比为了生产新的产品Ipad,发现原来的场地不够用,就把原来的工产拆了,然后建了一个更大的工厂(有钱任性,我们管不了,但是至少正常人不会这么干)。这样就显示出了简单工场模式的缺点:扩展性差。就是说不能生产新的产品。
工厂方法模式
场景引入
但是,如果创业者想要把企业做大,他肯定会在工厂中生产新产品。(有钱人总想变得更有钱,只有我被贫穷蒙蔽的双眼)。那么如果我们要生产新的产品,上面说的简单共产模式就不管用了,就引入了我们的工厂方法模式。这就好像是:为每一个设备创建一个工厂
代码实现
device interface
/*
接口,用来说明设备的生产过程
*/
public interface device {
void process();
}
phone.class
// 手机类,用来说明手机是怎么生产的
public class phone implements device{
public void process() {
System.out.println("手机的生产过程就是先这样这样,再那样那样,就生产出来了");
}
}
Watch.class
// 智能手环,用来说明智能手环是怎么生产的
public class Watch implements device {
public void process() {
System.out.println("智能手环的生产方式就是先那样那样,再这样这样,就生产出来了");
}
}
Ipad.class
// Ipad,用来说明Ipad是怎么生产的
public class Ipad implements device{
public void process() {
System.out.println("Ipad就是这样弄一下,那样弄一下,就生产出来了");
}
}
Factory.class
//把厂抽象出来,自己不做具体的生产实现
public abstract class Factory {
abstract device create();
}
phoneFactory.class
//生产手机的工厂,具体实现生产手机
public class phoneFactory extends Factory {
device create() {
return new phone();
}
}
WatchFactory.class
//生产智能手表的工厂,具体实现生产智能手表
public class WatchFactory extends Factory{
device create() {
return new Watch();
}
}
IpadFactory.class
//生产Ipad的工厂,具体实现生产Ipad
public class IpadFactory extends Factory{
device create() {
return new Ipad();
}
}
Test.class
public class Test {
public static void main(String[] args) {
Factory factory = new WatchFactory();
device watch = factory.create();
watch.process();
factory = new IpadFactory();
device ipad = factory.create();
ipad.process();
factory = new phoneFactory();
device phone = factory.create();
phone.process();
}
}
代码简要说明
在共产方法模式下,工厂不在做具体的生产实现,而是交给各个具体的分工厂去实现。但是,这种情况下,这时候,你要的产品就通过产品的具体类名体现出来:
这时候,当增加新的产品时,我们就不需要再改变工厂类了。比如,我们要增加一个新的产品:电脑。只需要增加新的类和具体的工厂。如下:
Computer:
public class Computer implements device{
public void process() {
System.out.println("电脑就是瞎捯饬捯饬就生产出来了");
}
}
ComputerFactory
public class ComputerFactory extends Factory{
device create() {
return new Computer();
}
}
然后我们再测试类中就可以直接使用了:
Test:
public class Test {
public static void main(String[] args) {
Factory factory = new WatchFactory();
device watch = factory.create();
watch.process();
factory = new IpadFactory();
device ipad = factory.create();
ipad.process();
factory = new phoneFactory();
device phone = factory.create();
phone.process();
factory = new ComputerFactory();
device computer = factory.create();
computer.process();
}
}
这就好像是开分工厂一样,这样就不需要将原来的工厂拆除,再建新的工厂。
抽象工厂模式
情景引入
刚刚那个创业者成功了,这时候就开始有人眼红了。于是,也想开始和他一样,做同样的工厂。因为有了前人的经验,新来的创业者发现这个工厂生产的东西已经固定下来了,而且用多个分厂,用显得非常的麻烦。于是,新来的创业者开的厂就把这些整合起来,用一个厂进行生产。抽象工厂模式的概念就是:一个抽象类中包含多个抽象产品类
代码实现
device interface
/*
接口,用来说明设备的生产过程
*/
public interface device {
void process();
}
phone.class
// 手机类,用来说明手机是怎么生产的
public class phone implements device{
public void process() {
System.out.println("手机的生产过程就是先这样这样,再那样那样,就生产出来了");
}
}
Watch.class
// 智能手环,用来说明智能手环是怎么生产的
public class Watch implements device {
public void process() {
System.out.println("智能手环的生产方式就是先那样那样,再这样这样,就生产出来了");
}
}
Ipad.class
// Ipad,用来说明Ipad是怎么生产的
public class Ipad implements device{
public void process() {
System.out.println("Ipad就是这样弄一下,那样弄一下,就生产出来了");
}
}
Computer.class
public class Computer implements device{
public void process() {
System.out.println("电脑就是瞎捯饬捯饬就生产出来了");
}
}
Factory.class
public abstract class Factory {
abstract device phoneCreate();
abstract device ipadCreate();
abstract device watchCreate();
abstract device computerCreate();
}
NewFactory.class
public class NewFactory extends Factory {
device phoneCreate() {
System.out.println("我是新创业者");
return new phone();
}
device ipadCreate() {
System.out.println("我是新创业者");
return new Ipad();
}
device watchCreate() {
System.out.println("我是新创业者");
return new Watch();
}
device computerCreate() {
System.out.println("我是新创业者");
return new Computer();
}
}
OldFactory.class
public class OldFactory extends Factory{
device phoneCreate() {
System.out.println("我是老创业者");
return new phone();
}
device ipadCreate() {
System.out.println("我是老创业者");
return new Ipad();
}
device watchCreate() {
System.out.println("我是老创业者");
return new Watch();
}
device computerCreate() {
System.out.println("我是老创业者");
return new Computer();
}
}
Test.class
public class Test {
public static void main(String[] args) {
Factory factory = new NewFactory();
device Newfactory = factory.computerCreate();
Newfactory.process();
Newfactory = factory.ipadCreate();
Newfactory.process();
Newfactory = factory.phoneCreate();
Newfactory.process();
Newfactory = factory.watchCreate();
Newfactory.process();
System.out.println("==============");
factory = new OldFactory();
device old = factory.computerCreate();
old.process();
old = factory.ipadCreate();
old.process();
old = factory.phoneCreate();
old.process();
old = factory.watchCreate();
old.process();
}
}
代码解读
抽象工厂模式就像是工厂方法模式的整合,因为那里面的具体工厂太多了,就显得很复杂,将一些产品放在一起进行抽象工厂,就会减少其复杂性。
写在最后
故事完整串联简单工厂模式,工厂方法模式、抽象工厂模式:简单工厂模式就像是早期的工厂,当要增加生产新的产品。因为地方不够,就用分工厂来进行解决,其实这里我们把简单共产模式想成早期的生产一样产品的更好理解。然后当新工厂不断增加时,工厂太多就不好进行管理,然后将一些工厂进行整合,形成抽象工厂模式。这就好像时现实生活中的工厂有很多的生产线,每条工厂线生产不同的产品。生活中就是将每个共产的量缩小,使得每个工厂都能生产公司的所有产品。或者是一个人用别人已有的模式来进行生产。具体的情况有很多很多。说多了,更容易让人不好理解,我就不多说啦。QAQ,该睡觉了,不然要猝死了。不懂的可以留言~~~~~