csdn没有在移动上布网,最近移动校园网登不上csdn,今天终于能登上了,小草鸟就写下最近在学的设计模式。
工厂估计也差不多是用的最多的了,对于工厂方法和抽象工厂比较容易混,笔者在这里说下自己的学习的一些理解。
工厂模式:
产品
对于工厂,当然是生产产品的了,当然我们得有产品类,为了扩展性良好,先定义一个产品接口
public interface Animal {
public void print();
}
有了产品接口,接下来当然是产品了
产品:猫
public class Cat implements Animal{
public void print(){
System.out.println("你是猫哦");
}
}
产品:鸡
public class Chicken implements Animal{
public void print(){
System.out.println("你是鸡哦");
}
}
产品:猪
public class Pig implements Animal{
public void print() {
System.out.println("你是猪哦");
}
}
工厂
哈哈,我们的产品都有了,下面我们不能把他们都放在哪里,当然得生产他们了
下面先定义一个工厂接口,这只是为了扩展性良好哦
public interface Produce{
public Animal produceAnimal();
}
工厂接口都有了,我们当然得有具体的工厂生产这些厂品了
工厂:猫
public class Factory_Cat implements Produce{
public Animal produceAnimal() {
return new Cat();
}
}
工厂:鸡
public class Factory_Chicken implements Produce {
public Animal produceAnimal() {
return new Chicken();
}
}
工厂:猪
public class Factory_Pig implements Produce {
public Animal produceAnimal() {
return new Pig();
}
}
哈哈,工厂有了,产品也有了,并且工厂也生产了需要的产品。接下来就是我们要的测试了
public class Test {
public void test(){
Produce cat = new Factory_Cat();
cat.produceAnimal().print();
Produce chicken = new Factory_Chicken();
chicken.produceAnimal().print();
Produce pig = new Factory_Pig();
pig.produceAnimal().print();
}
public static void main(String[] args) {
Test test = new Test();
test.test();
}
}
写到这里,大家不免会发现一些问题,这里只能生产动物,但是我想生产猪肉,鸡肉,这样的该怎么呢?
bing go!一些人也许会说我可以在建一个肉接口生产肉啊,这样当然能解决问题,只是增加了另一个工厂方法,
但是要是有很多类似的种类需要生产呢?我们会有好多好多的工厂,我们也许会晕头转向吧,哈哈,解决的办法来了,
就是我们的抽象工厂来啦。
新产品接口
public interface Meat {
public void meat();
}
新产品
产品:猫肉
public class Cat_Meat implements Meat {
public void meat() {
System.out.println("小猫当然没肉了");
}
}
产品:鸡肉
public class Chicken_Meat implements Meat{
public void meat() {
System.out.println("鸡肉挺美味的");
}
}
产品:猪肉
public class Pig_Meat implements Meat{
public void meat() {
System.out.println("猪肉还是挺好吃的");
}
}
抽象工厂接口
public interface Create {
public Meat produceMeat();
public Animal produceAnimal();
}
工厂:猫和猫肉
public class Factory_Cat_Meat implements Create {
public Meat produceMeat() {
return new Cat_Meat();
}
public Animal produceAnimal() {
return new Cat();
}
}
工厂:鸡和鸡肉
public class Factory_Chicken_Meat implements Create {
public Meat produceMeat() {
return new Chicken_Meat();
}
public Animal produceAnimal() {
return new Chicken();
}
}
工厂:猪和猪肉
public class Factory_Pig_Meat implements Create {
public Meat produceMeat() {
return new Pig_Meat();
}
public Animal produceAnimal() {
return new Pig();
}
}
现在的抽象工厂基本结束,从上面可以看出工厂方法和抽象工厂的区别就是一次性生产的东西多了点,这不能说明什么,也看不出有什么好处
下面我就简单的说个小例子说明他们之间的区别:
工厂方法模式:工厂方法模式可以对新产品进行有效的扩展,比如我们再生产猪耳朵,我们可以轻松的定义接口生产新的产品,
抽象工厂模式:抽象工厂模式可以对产品系列进行有效的扩展,对新产品的生产扩展就比较麻烦,因为我们需要修改顶层的接口里的内容,许多人可能说
这没什么,我都经常这么做,但是如果我们的顶层接口的实现类很庞大的话,这样做是很危险的,我们需要修改很多的类来适应顶层接口的改变,
对系列产品的扩展的好处怎么体现呢?
这就是说我们生产普通猪和猪肉,这作为一个系列,公司突然引进了黑猪和黑猪肉,不要慌张,我们可以很轻松的继承顶层的抽象接口,我们只需要写一个
普通的类,实现接口就可以了。
说到这里,他们到底该怎么用呢?我想对于公司的产品变动不是特别大,产品结构复杂性比较大的情况下,比较适合抽象工厂,而对于产品变动大,产品的
复杂性比较低的话,比较适合工厂方法来扩展产品。一般情况我们还可以用组合工厂来处理,这就比较复杂的情况了。
就到这里了,下一篇再和大家一起探讨设计模式。